perm filename OSA.MAC[11,HE] blob sn#656311 filedate 1982-04-29 generic text, type T, neo UTF8
; Copyright Xerox Corporation 1979
	.TITLE	OSA
	.DSABL	GBL
	.MCALL	.EXIT,.MRKT,.QSET

	.CSECT	GLOBAL
G=.
.=G+2.+2.
	.WORD	STOP
.=G+100.+100.
	.WORD	MOVBLK
	.WORD	ZERO
	.WORD	0
	.WORD	NOOP
	.WORD	SETBLK
	.WORD	CLLSWT
	.WORD	SYSERR
	.WORD	USC
	.WORD	GETFIX
	.WORD	FIXLFT

	.CSECT

CLKPS=300
CLKCAS=177546
CLKPLS=100
DYNSIZ=6500.
STKSIZ=100.
START=G+1.+1.
BINCLK=G+135.+135.

;
;ENTRY POINT FOR ALL BCPL PROGRAMS
;
ENTRY::
	CLR	@#CLKCAS		;DISABLE CLOCK
	MOV	#CLKINT,@#CLKPLS	;CLOCK PULSE INTERRUPT
	MOV	#CLKPS,@#CLKPLS+2	;
	CLR	BINCLK
	CLR	PLSCNT
	MOV	#100,@#CLKCAS	;ENABLE CLOCK INTERRUPT
;
;SETUP STACK
;
	MOV	#STKSIZ,R1	;GET 100 WORDS FOR BCPL STACK
	JSR	PC,GETFIX
	.WORD	0
	TST	R1		;DID I GET IT?
	BNE	ENTOK		;YES, BRANCH
	JSR	PC,SYSERR	;NO, HALT
	.WORD	0
ENTOK:
	ASL	R1		;CONVERT POINTER TO ADDRESS
	ADD	#2*STKSIZ,R1	;CALCULATE TOP OF STACK
	MOV	R1,R0		;R0 = STACK POINTER
;
;EXECUTE BCPL MAIN PROGRAM
;
	JSR	PC,@START	;EXECUTE MAIN PROGRAM
	.WORD	0
;
;EXIT POINT FOR BCPL PROGRAMS - MAIN PROGRAM RETURNS HERE
;
STOP::
	.EXIT
	.PAGE
;
;INTERRUPT ROUTINE ENTERED EVERY CLOCK PULSE
;
CLKINT:
	INC	PLSCNT		;INCREMENT PULSE COUNTER
	CMP	PLSCNT,#6	;6 COUNTS = 100 MSEC
	BNE	NOCNT		;
	CLR	PLSCNT		;100 MSEC, START AGAIN
	INC	BINCLK		;INCREMENT BINCLK
NOCNT:
	MOV	#100,@#CLKCAS	;ENABLE CLOCK INTERRUPT
	RTI			;RETURN FROM INTERRUPT
;
PLSCNT:	.BLKW	1		;PULSE COUNTER (1/60 SEC)
	.PAGE
;
;SUBROUTINE MOVEBLOCK(DEST,SRC,COUNT)
;
MOVBLK::
	ASL	R1		;CONVERT POINTERS
	ASL	R2		;	TO ADDRESSES
	TST	R3
	BGT	MVBLK1		;POSITIVE CNT OK
	BEQ	MVBLK2		;NO MOVE IF CNT = 0
	JSR	PC,CLLSWT	;NEG CNT ILLEGAL
	.WORD	0
MVBLK1:
	MOV	(R2)+,(R1)+
	SOB	R3,MVBLK1
MVBLK2:
	ADD	#2,@SP
	RTS	PC		;RETURN
;
;SUBROUTINE ZERO(DEST,COUNT)
;
ZERO::
	ASL	R1		;CONVERT POINTER TO ADDRESS
	TST	R2
	BGT	ZERO1
	JSR	PC,CLLSWT
	.WORD	0
ZERO1:
	CLR	(R1)+
	SOB	R2,ZERO1
	ADD	#2,@SP
	RTS	PC		;RETURN
;
;SUBROUTINE NOOP()
;
NOOP::
	ADD	#2,@SP
	RTS	PC		;RETURN
;
;SUBROUTINE SETBLOCK(DEST,VALUE,COUNT)
;
SETBLK::
	ASL	R1		;CONVERT POINTER TO ADDRESS
	TST	R3
	BGT	STBLK1
	JSR	PC,CLLSWT
	.WORD	0
STBLK1:
	MOV	R2,(R1)+
	SOB	R3,STBLK1
	ADD	#2,@SP
	RTS	PC		;RETURN
;
;SUBROUTINE CALLSWAT()
;
CLLSWT::
	HALT
;
;SUBROUTINE SYSERR()
;
SYSERR::
	JSR	PC,CLLSWT
	.WORD	0
;
;SUBROUTINE USC(A,B) = 1/0/-1
;
USC::
	CMP	R1,R2
	BEQ	USCEQ
	BHI	USCHI
	MOV	#-1,R1
	BR	USCEX
USCEQ:
	CLR	R1
	BR	USCEX
USCHI:
	MOV	#1,R1
USCEX:
	ADD	#2,@SP
	RTS	PC		;RETURN
	.PAGE
;
;SUBROUTINE GETFIXED(NWORDS) = POINTER OR 0
;
GETFIX::
	MOV	R1,R2		;SAVE NWORDS
	MOV	SIZ,R1		;NWORDS LEFT
	CMP	R1,R2		;FEWER THAN REQUESTED?
	BLO	GETNO		;YES, BRANCH
	MOV	TOP,R1		;NO, RETURN ADDRESS
	CLC			;	AS POINTER
	ROR	R1		;
	SUB	R2,SIZ		;UPDATE SIZ
	ASL	R2		;CONVERT NWORDS TO BYTES
	ADD	R2,TOP		;UPDATE TOP
	BR	GETEX
GETNO:
	CLR	R1		;RETURN ZERO
GETEX:
	ADD	#2,@SP		;RETURN
	RTS	PC
;
;SUBROUTINE FIXEDLEFT() = NWORDS
;
FIXLFT::
	MOV	SIZ,R1		;NWORDS LEFT
	ADD	#2,@SP		;RETURN
	RTS	PC
;
SIZ:	.WORD	DYNSIZ		;SIZE OF UNUSED BLOCK (WORDS)
DYN::	.BLKW	DYNSIZ		;MEMORY BLOCK
TOP::	.WORD	DYN		;LOC OF UNUSED BLOCK (BA)
	.END	ENTRY
≠(1729)